/*
 * StrBlobPtr.h
 *
 *  Created on: 2020年11月27日
 *      Author: san
 */

#ifndef STRBLOBPTR_H_
#define STRBLOBPTR_H_

#include <memory>
#include <vector>
#include <string>

#include "StrBlob.h"

class StrBlob;
class StrBlobPtr {
	friend class StrBlobPtrPtr;
public:
	StrBlobPtr(): curr(0) {}
	// 构造函数
	StrBlobPtr(const StrBlob &a, size_t sz = 0):
		wptr(a.data), curr(sz) {}
	StrBlobPtr(const StrBlobPtr &a);

	// 解引用, 返回StrBlob中vector中的元素
	std::string &deref() const;
	// 前缀递增
	StrBlobPtr &incr();
	size_t getCurr() const { return curr; }

	friend bool operator ==(const StrBlobPtr &, const StrBlobPtr &);
	StrBlobPtr &operator ++();  // 前置运算符
	StrBlobPtr &operator ++(int);  // 后置运算符, 调用时不用管这个参数
	std::string &operator*() const;  // 解引用
	std::string *operator->() const;  // 箭头运算符

	std::size_t size() {return 0;}

	virtual ~StrBlobPtr();

private:
	// 若检查成功，check返回一个指向vector的shared_ptr
	std::shared_ptr<std::vector<std::string>> check(
			std::size_t, const std::string &) const;
	std::weak_ptr<std::vector<std::string>> wptr;  // wptr不会增加引用计数
	std::size_t curr;
};

#endif /* STRBLOBPTR_H_ */
